package singleton.main;

/*
 * 单例模式
 *     使用单例模式要点：
 *      （1）这个类只能有一个实例；
 *      （2）这个类必须自行创建这个实例；
 *      （3）该类必须自行向整个系统提供这个实例；
 *
 * 通常适用的场景的特点。
 *     在应用场景中，某类只要求生成一个对象的时候，如一个班中的班长、每个人的身份证号等。
 *     当对象需要被共享的场合。由于单例模式只允许创建一个对象，共享该对象可以节省内存，并加快对象访问速度。如 Web 中的配置对象、数据库的连接池等。
 *     当某类需要频繁实例化，而创建的对象又频繁被销毁的时候，如多线程的线程池、网络连接池等。
 *
 * Singleton 模式通常有两种实现形式。
 *
 * 第 1 种：懒汉式单例
 * 该模式的特点是类加载时没有生成单例，只有当第一次调用 getlnstance 方法时才去创建这个单例
 *
 * 注意：如果编写的是多线程程序，则不要删除上例代码中的关键字 volatile 和 synchronized，否则将存在线程非安全的问题。
 * 如果不删除这两个关键字就能保证线程安全，但是每次访问时都要同步，会影响性能，且消耗更多的资源，这是懒汉式单例的缺点。
 *
 *
 * */
public class LazySingleton {
    private static volatile LazySingleton instance = null;    //保证 instance 在所有线程中同步

    private LazySingleton() {
        //private 避免类在外部被实例化
    }

    public static synchronized LazySingleton getInstance() {
        //getInstance 方法前加同步
        if (instance == null) {
            instance = new LazySingleton();
        }
        return instance;
    }
}
